package repo

import (
	"context"
	"github.com/star-find-cloud/star-chat/rule/domain"
)

// RoleRepository 规则持久化接口
type RoleRepository interface {
	// Create 创建规则
	Create(ctx context.Context, rule *domain.Rule) (int64, error)

	// GetAll 获取所有规则, 从数据库中读取
	GetAll(ctx context.Context) ([]*domain.Rule, error)

	// Update 修改规则, 可以修改所有字段, 使用 MakeRuleCache 更新缓存
	Update(ctx context.Context, role *domain.Rule) error

	// Enable 启用规则
	Enable(ctx context.Context, id int64) error

	// Disable 禁用规则
	Disable(ctx context.Context, id int64) error

	// Delete 删除规则
	Delete(ctx context.Context, id int64) error

	IsExistByName(ctx context.Context, name string) (bool, error)
}

// RoleCache 规则缓存接口
type RoleCache interface {
	// MakeRuleCache 创建规则缓存, 在创建和修改规则时调用
	MakeRuleCache(ctx context.Context, id int64, rule *domain.Rule) error

	// Get 获取规则, 缓存中读取, 若规则被删除或禁用, 则返回相应错误
	//读取不到时, 调用 LockWrite 避免缓存击穿
	Get(ctx context.Context, id int64) (*domain.Rule, error)

	// GetRuleUnscoped 获取规则, 缓存中读取, 不做任何判断
	GetRuleUnscoped(ctx context.Context, id int64) (*domain.Rule, error)

	// EnableCache 将规则状态设置为启用, 写入缓存
	EnableCache(ctx context.Context, id int64) error

	// DisableCache 将规则状态设置为禁用, 写入缓存
	DisableCache(ctx context.Context, id int64) error

	// DeleteCache 删除规则, 缓存状态设置为已删除
	DeleteCache(ctx context.Context, id int64) error
}

// RuleOrchestrator 规则复杂操作编排接口
type RuleOrchestrator interface {
	// LockWrite 锁写入, 缓存查询不到时, 加锁写入缓存, 避免缓存击穿, 通道返回是否需要进行重试
	LockWrite(ctx context.Context, id int64) error

	// IsExist  通过id查询是否存在, 如果存在返回true, 不存在返回false
	IsExist(ctx context.Context, id int64) (bool, error)
}
